package 中等.链表;

import util.ListNode;

/**
 * 给定单链表的头节点 head ，将所有索引为奇数的节点和索引为偶数的节点分别组合在一起，然后返回重新排序的列表。
 * 第一个节点的索引被认为是 奇数 ， 第二个节点的索引为 偶数 ，以此类推。
 * 请注意，偶数组和奇数组内部的相对顺序应该与输入时保持一致。
 * 你必须在 O(1) 的额外空间复杂度和 O(n) 的时间复杂度下解决这个问题。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/odd-even-linked-list
 */
public class 奇偶链表_328 {

    public static void main(String[] args) {

        ListNode n1 = new ListNode(1);
        ListNode n2 = new ListNode(2);
        ListNode n3 = new ListNode(3);
        ListNode n4 = new ListNode(4);
        n1.next = n2;
        n2.next = n3;
        n3.next = n4;

        efficientOddEvenList(n1);

    }

    public static ListNode efficientOddEvenList(ListNode head) {
        if (head == null) {
            return null;
        }
        ListNode ouHead = head.next;
        ListNode ouTemp = ouHead, jiTemp = head;
        while (ouTemp != null && ouTemp.next != null) {
            // 奇数指针指向偶数的下一个指针
            jiTemp.next = ouTemp.next;
            jiTemp = jiTemp.next;
            // 偶数指针指向奇数的下一个指针
            ouTemp.next = jiTemp.next;
            ouTemp = ouTemp.next;
        }

        jiTemp.next = ouHead;
        return head;
    }

    //输入: head = [1,2,3,4,5]
    //输出: [1,3,5,2,4]
    public static ListNode oddEvenList(ListNode head) {
        if (head == null) {
            return null;
        }
        if (head.next == null) {
            return head;
        }
        ListNode jiHead = new ListNode(head.val);
        ListNode ouHead = new ListNode(head.next.val);
        int count = 3;

        ListNode jiTemp = jiHead, ouTemp = ouHead;
        ListNode tempNode = head.next.next;
        while (tempNode != null) {
            if (count % 2 == 1) {
                jiTemp.next = new ListNode(tempNode.val);
                jiTemp = jiTemp.next;
            } else {
                ouTemp.next = new ListNode(tempNode.val);
                ouTemp = ouTemp.next;
            }

            tempNode = tempNode.next;
            count++;
        }

        jiTemp.next = ouHead;
        return jiHead;
    }

}
